package br.com.foxinline.servico;

import br.com.foxinline.modelo.CadastroDomiciliar;
import br.com.foxinline.modelo.CadastroDomiciliarFamilias;
import br.com.foxinline.modelo.Cidadao;
import br.com.foxinline.modelo.Equipe;
import br.com.foxinline.modelo.MicroArea;
import br.com.foxinline.modelo.Profissional;
import br.com.foxinline.modelo.QuestionarioAutoReferido;
import br.com.foxinline.modelo.Unidade;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.Query;
import javax.persistence.Transient;

/**
 *
 * @author laverson
 */
@Stateless
public class CadastroDomiciliarServico extends ServicoGenerico<CadastroDomiciliar> {

    private Long quantidadeRegistrosResults;

    public CadastroDomiciliarServico() {
        super(CadastroDomiciliar.class);
    }

    public List<CadastroDomiciliar> autocomplete(String query) {
        return getEntityManager().createQuery("select c from " + CadastroDomiciliar.class.getSimpleName() + " c where LOWER(c.nome) LIKE '%" + query.toLowerCase().trim() + "%'").getResultList();
    }

    @Override
    public List<CadastroDomiciliar> pesquisar(CadastroDomiciliar cadastro, int first, int pageSize) {
        String select = "SELECT cadastro ";
        String sql = "FROM CadastroDomiciliar cadastro ";
        String orderBy = "ORDER BY cadastro.id ASC";

        Cidadao cidadao = null;
        Profissional profissional = null;
        Cidadao responsavel = null;
        Equipe equipe = null;
        Unidade unidade = null;
        MicroArea microArea = null;

//        if (cadastro.getCidadao() != null) {
//            cidadao = cadastro.getCidadao();
//            if ((cidadao.getNumeroCartaoSus() != null && !cidadao.getNumeroCartaoSus().isEmpty())
//                    || (cidadao.getNome() != null && !cidadao.getNome().isEmpty())) {
//                sql += " JOIN cadastro.cidadao cidadao ";
//            }
//        }
//
        if (cadastro.getCadastroDomiciliarFamilias() != null && !cadastro.getCadastroDomiciliarFamilias().isEmpty()) {

            CadastroDomiciliarFamilias familia = cadastro.getCadastroDomiciliarFamilias().get(0);

            if (familia != null && familia.getResponsavel() != null) {
                responsavel = familia.getResponsavel();
            }

            if ((responsavel.getNumeroCartaoSus() != null && !responsavel.getNumeroCartaoSus().isEmpty())
                    && (responsavel.getNome() != null && !responsavel.getNome().isEmpty())) {
                sql += " JOIN cadastro.cadastroDomiciliarFamilias familia JOIN familia.responsavel responsavel ";
            }
        }

        if (cadastro.getProfissional() != null) {
            profissional = cadastro.getProfissional();

            equipe = profissional.getEquipe() != null ? profissional.getEquipe() : null;
            microArea = profissional.getMicroArea() != null ? profissional.getMicroArea() : null;

            if (equipe != null) {
                unidade = equipe.getUnidade() != null ? equipe.getUnidade() : null;
            }

            if ((profissional.getNumeroCartaoSus() != null && !profissional.getNumeroCartaoSus().isEmpty())
                    || (profissional.getNome() != null && !profissional.getNome().isEmpty())) {

                sql += "JOIN cadastro.profissional profissional ";

                if (unidade != null && unidade.getCodigoCNES() != null && !unidade.getCodigoCNES().isEmpty()) {
                    sql += "JOIN profissional.equipe equipe JOIN equipe.unidade unidade ";

                } else if ((equipe.getCodigo() != null && !equipe.getCodigo().isEmpty())) {
                    sql += "JOIN profissional.equipe equipe ";
                }

                if (microArea != null && microArea.getCodigo() != null && !microArea.getCodigo().isEmpty()) {
                    sql += "JOIN profissional.microArea microArea ";
                }
            }
        }

        sql += " where ";

        if (cidadao != null) {
            if (cidadao.getNumeroCartaoSus() != null && !cidadao.getNumeroCartaoSus().isEmpty()) {
                sql += "LOWER(cidadao.numeroCartaoSus) LIKE LOWER(:numeroCartaoSUSCidadao) AND ";
            }
            if (cidadao.getNome() != null && !cidadao.getNome().isEmpty()) {
                sql += "LOWER(cidadao.nome) LIKE LOWER(:nomeCidadao) AND ";
            }
        }

        if (responsavel != null) {
            if (responsavel.getNumeroCartaoSus() != null && !responsavel.getNumeroCartaoSus().isEmpty()) {
                sql += "LOWER(responsavel.numeroCartaoSus) LIKE LOWER(:numeroCartaoSUSResponsavel) AND ";
            }
            if (responsavel.getNome() != null && !responsavel.getNome().isEmpty()) {
                sql += "LOWER(responsavel.nome) LIKE LOWER(:nomeResponsavel) AND ";
            }
        }

        if (profissional != null) {
            if (profissional.getNumeroCartaoSus() != null && !profissional.getNumeroCartaoSus().isEmpty()) {
                sql += "LOWER(profissional.numeroCartaoSus) LIKE LOWER(:numeroCartaoSusProfissional) AND ";
            }
            if (profissional.getNome() != null && !profissional.getNome().isEmpty()) {
                sql += "LOWER(profissional.nome) LIKE LOWER(:nomeProfissional) AND ";
            }
        }

        if (unidade != null && unidade.getCodigoCNES() != null && !unidade.getCodigoCNES().isEmpty()) {
            sql += "LOWER(unidade.codigoCNES) LIKE LOWER(:codigoCNESUnidade) AND ";
        }

        if (equipe != null && equipe.getCodigo() != null && !equipe.getCodigo().isEmpty()) {
            sql += "LOWER(equipe.codigo) LIKE LOWER(:codigoEquipe) AND ";
        }

        if (microArea != null && microArea.getCodigo() != null && !microArea.getCodigo().isEmpty()) {
            sql += "LOWER(microArea.codigo) LIKE LOWER(:codigoMicroArea) AND ";
        }

        if (cadastro.getDataCadastro() != null) {
            sql += "LOWER(cadastro.dataCadastrado) LIKE LOWER(:dataCadastro) AND ";
        }

        sql += "cadastro.ativo = true AND cadastro.atual = true ";

        Query query = getEntityManager().createQuery(select.concat(sql).concat(orderBy));

        setQuantidadeRegistros(sql, query, cadastro);

        setParameters(query, cadastro);

        query.setFirstResult(first).setMaxResults(pageSize);

        return query.getResultList();
    }

    @Transient
    private void setParameters(Query query, CadastroDomiciliar cadastro) {
        Cidadao cidadao = null;
        Cidadao responsavel = null;
        Profissional profissional = null;
        Equipe equipe = null;
        Unidade unidade = null;
        MicroArea microArea = null;

//        if (cadastro.getCidadao() != null) {
//            cidadao = cadastro.getCidadao();
//        }
//
        if (cadastro.getProfissional() != null) {
            profissional = cadastro.getProfissional();

            equipe = profissional.getEquipe() != null ? profissional.getEquipe() : null;
            microArea = profissional.getMicroArea() != null ? profissional.getMicroArea() : null;

            if (equipe != null) {
                unidade = equipe.getUnidade() != null ? equipe.getUnidade() : null;
            }
        }

        if (cadastro.getCadastroDomiciliarFamilias() != null && !cadastro.getCadastroDomiciliarFamilias().isEmpty()) {

            CadastroDomiciliarFamilias familia = cadastro.getCadastroDomiciliarFamilias().get(0);

            if (familia != null && familia.getResponsavel() != null) {
                responsavel = familia.getResponsavel();
            }
        }

        if (cidadao != null) {
            if (cidadao.getNumeroCartaoSus() != null && !cidadao.getNumeroCartaoSus().isEmpty()) {
                query.setParameter("numeroCartaoSUSCidadao", "%" + cidadao.getNumeroCartaoSus().trim() + "%");
            }
            if (cidadao.getNome() != null && !cidadao.getNome().isEmpty()) {
                query.setParameter("nomeCidadao", "%" + cidadao.getNome().trim() + "%");
            }
        }

        if (responsavel != null) {
            if (responsavel.getNumeroCartaoSus() != null && !responsavel.getNumeroCartaoSus().isEmpty()) {
                query.setParameter("numeroCartaoSUSResponsavel", "%" + responsavel.getNumeroCartaoSus().trim() + "%");
            }
            if (responsavel.getNome() != null && !responsavel.getNome().isEmpty()) {
                query.setParameter("nomeResponsavel", "%" + responsavel.getNome().trim() + "%");
            }
        }

        if (profissional != null) {
            if (profissional.getNumeroCartaoSus() != null && !profissional.getNumeroCartaoSus().isEmpty()) {
                query.setParameter("numeroCartaoSusProfissional", "%" + profissional.getNumeroCartaoSus().trim() + "%");
            }
            if (profissional.getNome() != null && !profissional.getNome().isEmpty()) {
                query.setParameter("nomeProfissional", "%" + profissional.getNome().trim() + "%");
            }
        }

        if (unidade != null && unidade.getCodigoCNES() != null && !unidade.getCodigoCNES().isEmpty()) {
            query.setParameter("codigoCNESUnidade", "%" + unidade.getCodigoCNES().trim() + "%");
        }

        if (equipe != null && equipe.getCodigo() != null && !equipe.getCodigo().isEmpty()) {
            query.setParameter("codigoEquipe", "%" + equipe.getCodigo().trim() + "%");
        }

        if (microArea != null && microArea.getCodigo() != null && !microArea.getCodigo().isEmpty()) {
            query.setParameter("codigoMicroArea", "%" + microArea.getCodigo().trim() + "%");
        }

        if (cadastro.getDataCadastro() != null) {
            query.setParameter("dataCadastro", cadastro.getDataCadastro());
        }
    }

    private void setQuantidadeRegistros(String sql, Query query, CadastroDomiciliar cadastro) {

        String select = "SELECT count(cadastro) ";

        query = getEntityManager().createQuery(select.concat(sql));

        setParameters(query, cadastro);

        quantidadeRegistrosResults = (Long) query.getSingleResult();
    }

    @Override
    public Long quantidadeRegistros() {
        return quantidadeRegistrosResults;
    }

    /**
     *
     * @param CadastroDomiciliar
     * @param cidadao
     * @param questionario
     * @return
     *
     * Pesquisa Genérica Cadastro Individual By Ely
     */
    public List<CadastroDomiciliar> pesquisarCadastroDomiciliar(CadastroDomiciliar CadastroDomiciliar, Cidadao cidadao, QuestionarioAutoReferido questionario, MicroArea microArea) {
        String sql = "select c from CadastroDomiciliar c ";

        if (microArea != null && microArea.getId() != null) {
            sql += " JOIN c.profissional p JOIN p.microArea m";
        }

        if (cidadao != null) {
            if (cidadao.getNome() != null && !cidadao.getNome().isEmpty()) {
                sql += " JOIN c.cidadao cid";
            }
        }

        if (questionario.getTuberculose() == true || questionario.getDiabetes() || questionario.getGestante()
                || questionario.getCancer() == true || questionario.getDstsAids() == true || questionario.getAvc() == true
                || questionario.getHipertensao() == true || questionario.getPossuiProblemaRenal() == true
                || questionario.getPossuiDoencaCardiaca() == true || questionario.getPossuiDoencaPulmonar() == true) {
            sql += "  JOIN c.questionarioAutoReferido q ";
        }

        sql += " WHERE ";

        if (questionario.getTuberculose() == true) {
            sql += " q.tuberculose = true and ";
        }
        if (questionario.getDiabetes() == true) {
            sql += " q.diabetes = true and ";
        }
        if (questionario.getGestante() == true) {
            sql += " q.gestante = true and ";
        }
        if (questionario.getCancer() == true) {
            sql += " q.cancer = true and ";
        }
        if (questionario.getDstsAids() == true) {
            sql += " q.dstsAids = true and ";
        }
        if (questionario.getAvc() == true) {
            sql += " q.avc = true and ";
        }
        if (questionario.getHipertensao() == true) {
            sql += " q.hipertensao = true and ";
        }
        if (questionario.getPossuiProblemaRenal() == true) {
            sql += " q.possueProblemaRenal = true and ";
        }
        if (questionario.getPossuiDoencaCardiaca() == true) {
            sql += " q.possuiDoencaCardiaca = true and ";
        }
        if (questionario.getPossuiDoencaPulmonar() == true) {
            sql += " q.criancaDesnutrida = true and ";
        }

        if (microArea != null && microArea.getId() != null) {
            sql += " m.id = :microID and ";
        }
        sql += " 1=1 ";

        if (cidadao != null) {
            if (cidadao.getNome() != null && !cidadao.getNome().isEmpty()) {
                sql += " Order by c.cidadao.nome ASC";
            }
        }

        Query query = getEntityManager().createQuery(sql);

        if (microArea != null && microArea.getId() != null) {
            query.setParameter("microID", microArea.getId());
        }

        return query.getResultList();
    }
}
